#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#include "Globales.h"
#include "TLexico.h"
#include "TLista.h"
#include "TListaOrdenada.h"

void TListaOrdenada_Crear(TListaOrdenada* pLo, int iTamanioDato) {
  TLista_Crear(&(pLo->m_xLista), iTamanioDato);
}

void TListaOrdenada_Vaciar(TListaOrdenada* pLo) {
  TLista_Vaciar(&(pLo->m_xLista));
}

eBoolean TListaOrdenada_Vacia(TListaOrdenada Lo) {
  return (TLista_Vacia(Lo.m_xLista));
}

void TListaOrdenada_ElemCorriente(TListaOrdenada Lo, void *pE) {
  TLista_ElemCorriente(Lo.m_xLista, pE);
}

void TListaOrdenada_ModifCorriente(TListaOrdenada* pLo, void* pE) {
  TLista_ModifCorriente(&(pLo->m_xLista), pE);
}

eBoolean TListaOrdenada_MoverCorriente(TListaOrdenada* pLo, TMovimiento_Ls M) {
  TLista_MoverCorriente(&(pLo->m_xLista), M);
  return ebTrue;
}

void TListaOrdenada_BorrarCorriente(TListaOrdenada* pLo) {
  TLista_BorrarCorriente(&(pLo->m_xLista));
}

eBoolean TListaOrdenada_Insertar(TListaOrdenada* pLo, void* pE) {
  char* szNuevaClave = NULL;
  char* szClaveLeida = NULL;
  tweet_user* xUsuarioLeido;
  tweet_user* xUsuarioRecibido;
  TMovimiento_Ls eTipoMovimiento;
  xUsuarioRecibido = pE;
  if (TLista_Vacia(pLo->m_xLista) == ebFalse) {
    TListaOrdenada_MoverCorriente(pLo, LS_PRIMERO);
    TListaOrdenada_ElemCorriente(*pLo, xUsuarioLeido);
    strcpyMem(&szClaveLeida, xUsuarioLeido->m_szUser);
    strcpyMem(&szNuevaClave, xUsuarioRecibido->m_szUser);
    if (strcmp(szNuevaClave, szClaveLeida) <= 0) {
      eTipoMovimiento = LS_PRIMERO;
    } else {
      eTipoMovimiento = LS_ANTERIOR;
      if (pLo->m_xLista.Corriente->Siguiente != NULL) {
        do {
          TListaOrdenada_MoverCorriente(pLo, LS_SIGUIENTE);
          TListaOrdenada_ElemCorriente(*pLo, xUsuarioLeido);
          strcpyMem(&szClaveLeida, xUsuarioLeido->m_szUser);
        } while (strcmp(szNuevaClave, szClaveLeida) > -1 && pLo->m_xLista.Corriente->Siguiente != NULL);
        if (pLo->m_xLista.Corriente->Siguiente == NULL && strcmp(szNuevaClave, szClaveLeida) > -1) {
          eTipoMovimiento = LS_SIGUIENTE;
        }
      } else {
        eTipoMovimiento = LS_SIGUIENTE;
      }
    }
  }
  strcpyMem(&szClaveLeida, "");
  strcpyMem(&szNuevaClave, "");
  TLista_Insertar(&(pLo->m_xLista), eTipoMovimiento, pE);
  return ebTrue;
}
